import os
from flask import Flask


def create_app(test_config=None):
    """应用工厂函数
    """
    # 创建Flask实例
    # __name__：当前 Python 模块的名称
    # instance_relative_config=True：应用配置文件是相对于 instance folder 的相对路径
    app = Flask(__name__, instance_relative_config=True)
    # 设置一个应用的 缺省配置
    # SECRET_KEY：被 Flask 和扩展用于保证数据安全的。
    #   在开发过程中，为了方便可以设置为 'dev'，但是在发布的时候应当使用一个随机值来 重载它。
    # DATABASE：SQLite数据库文件存放在路径。
    app.config.from_mapping(
        SECRET_KEY='dev',
        DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'),
    )

    if test_config:
        # test_config：单独设置配置参数，替代实例配置。这样可以实现 测试和开发的配置分离，相互独立。
        app.config.from_mapping(test_config)
    else:
        # 使用 config.py 中的值来重载缺省配置
        app.config.from_pyfile('config.py', silent=True)

    try:
        # 确保 app.instance_path 存在
        os.makedirs(app.instance_path)
    except OSError:
        pass

    # 创建一个简单的路由
    @app.route('/hello')
    def hello():
        return 'Hello, World!'

    # 初始化数据库
    from .db import init_app
    init_app(app)

    # 导入并注册 验证蓝图
    from .auth import bp
    app.register_blueprint(bp)

    # 导入并注册 博客蓝图
    from .blog import bp
    app.register_blueprint(bp)
    app.add_url_rule('/', endpoint='index')
    return app
